//
//  Theme.swift
//  FearfulNotification
//
//  Created by Jabin on 2019/5/25.
//  Copyright © 2019 筱鹏. All rights reserved.
//

import UIKit

fileprivate let LocalStorageThemeType: String = "FearfulNotificationCurrentThemeType"

/** 主题协议 */
public protocol ThemeProtocol {
    /** 颜色 */
    static var color: ThemeColorProtocol.Type { get }
    /** 字体 */
    static var font: ThemeFontProtocol.Type { get }
}

/** 主题颜色协议 */
public protocol ThemeColorProtocol {
    /** 背景色 */
    static var background: UIColor { get }
    static var foreground: UIColor { get }
    
    /** 导航按钮颜色 */
    static var navigationButtonText: UIColor { get }
    /** 导航标题 */
    static var navigationTitle: UIColor { get }
    
    /** 标题 */
    static var title: UIColor { get }
    /** 描述 */
    static var description: UIColor { get }
    /** 生日日期 */
    static var date: UIColor { get }
    /** 分割线 */
    static var septationLine: UIColor { get }
    
    /** 指示器前景 */
    static var indicatorForeground: UIColor { get }
    /** 指示器背景 */
    static var indicatorBackground: UIColor { get }
}

/** 主题字体大小协议 */
public protocol ThemeFontProtocol {
    /** 标题字体 */
    static var title: UIFont { get }
    /** 描述简介字体 */
    static var description: UIFont { get }
    /** 日期 */
    static var date: UIFont { get }
    /** 指示器前景 */
    static var indicatorForeground: UIFont { get }
}

/** 主题类型 */
public enum ThemeType: Int {
    case dark       = 0
    case light      = 1
    case custom     = 10
}

/** 主题 */
public struct Theme {
    
    /** 当前正在使用的主题类型 */
    static var type: ThemeType = .dark
    
    /** 存储主题类型到本地 */
    private static func save(toLocal type: ThemeType) {
        UserDefaults.standard.set(type.rawValue, forKey: LocalStorageThemeType)
        UserDefaults.standard.synchronize()
    }
    
    /** 读取本地存储的类型 （如果不存在 使用默认 .dark） */
    private static func obtainFromLocal() -> ThemeType {
        let localTypeRawValue = UserDefaults.standard.integer(forKey: LocalStorageThemeType)
        guard let localType = ThemeType(rawValue: localTypeRawValue) else { return .dark }
        return localType
    }
}

extension Theme {
    /**
     * 应用初始化时调用 （为了读取本地选中的最新主题）
     * 在 applicationDidFinishLaunchingWithOptions 中最开始调用
     */
    static func load() {
        type = obtainFromLocal()
    }
    
    /** 改变主题，传入主题类型 */
    static func change(_ type: ThemeType) {
        if self.type == type {
            return
        }
        self.type = type
        save(toLocal: type)
        didChange()
    }
    
    private static func didChange() {
        // 重新设置应用
    }
}

extension Theme {
    /** 主题 */
    static var theme: ThemeProtocol.Type {
        switch type {
        case .dark:
            return DarkTheme.self
            
        default:
            return DarkTheme.self
        }
    }
    
    /** 颜色 */
    static var color: ThemeColorProtocol.Type {
        return self.theme.color
    }
    
    /** 字体 */
    static var font: ThemeFontProtocol.Type {
        return self.theme.font
    }
}
